Date		:	10 Novembre 1991 
		Protection	:	ECRANS DE RAPPEL
		Programme	:       VGACOPY V3.2A
		Outils		:	SOFT-ICE V2.50
		Fichier		:	FILLUP!.EXE et VGACOPY.COM
		Temps pass�	:	3 HEURES
		Soci�t�		:	SHARWARE
		Divers	        :	Incapable de reconnaitre une disquette
					1.2Mo formatt�e en 730k !
		Origine		:	L.F.
		Num�ro		:	150

	
	Deux programmes interessant l'un FILLUP! pour remplir les disquettes
	afin d'emp�cher un virus d'entrer et l'autre un copieur tous formats
	en VGA ! L'un et l'autre compact� "maison".
	Le compactage est relativement curieux: certaines instructions se
	retrouvent malgr� tout en "entier". C'est essentiellement le cas pour
	FILLUP! ce qui permet de le modifier relativement facilement:

	CS=0FAE
	CS:00E2 807EFF18  CMP	BYTE PTR [BP-01],18 ; AFFICHE 18 LIGNES.
	CS:00E6 7584	  JNZ	006C	; TANT QUE TOUT N'EST PAS AFFICHE.

	Avec PCTOOLS chercher 187584 et modifier 75 par 74.

	Pour VGACOPY on trouve le m�me type d'instructions avec le m�me test
	mais impossible de mettre en �vidence le saut dans le fichier.
	Une recherche en �criture de la valeur 74 avec SOFT-ICE me fait
	remonter une dizaine de niveaux jusqu'� ce que j'arrive � la chaine
	qui se trouve en clair dans le fichier. Mais comme il fallait s'y
	attendre une modification d'un octet se r�percute sur la suite du
	d�compactage et tout se plante.
	Ci-dessous les deux sauts � modifier ( 74 par EB ):

	1)-	

	0FAE:2F01 80BEF8FC14
	0FAE:2F06 7403		JNZ    ; A REMPLACER PAR EB ( jmp ).
	0FAE:2F08 E948FF	CALL

	2)-

	0FAE:2FC9 80BEF9FC06
	0FAE:2FCE 7403		JNZ    ; A REMPLACER PAR EB ( jmp )
	0FAE:2FD0 E91CFE	CALL

	Il ne reste plus qu'�:

	a)  Mettre en �vidence l'INT la plus proche, il s'av�re que c'est
	    l'INT 21 sous-fonction 47.
	b)  Placer les adresses IP correspondantes: 2F06 et 2FCE.

	c)  Puis lancer le gaufrier apocalyptique:
	    
; 	PATCH POUR LE PROGRAMME VGACOPY.EXE
;	DETOURNEMENT DE L'INT 21 SOUS-FONCTION 47
;
;******************************************************************************
;			      ZONE A INITIALISER

adr_ip1		equ	2f06h	; mettre EB � la place de 74.
adr_ip2         equ     2fceh   ; .........idem..............
INT_DET         equ     21h     ; Le num�ro de l'INT que l'on veut utiliser.
sous_fonction   equ     47h     ; Sous-fonction utilis�e.

;******************************************************************************

seg_a		segment	byte public

		assume	cs:seg_a, ds:seg_a, es:seg_a, ss:seg_a
  
		org	100h

sto		proc	far

start:
		jmp	init		; r�duire la m�moire et d�placer la 
		db	90h		; pile plus pr�s.

nom_prg		db	0ffh,0,0,0,0,0,0,0,0,0,0,0,0	; 12 car max + nul
paramet		dw	0		; M�me bloc d'environnement.		
ENVIR		dw	0		; Les param�tres de la ligne de 
data_3		dw	0		; commande sont recopi�s ici puis
FCB_1		dw	0		; transmis au programme fils. ( 80h )
data_5		dw	0		; "LOAD /U EGA 1"
FCB_2		dw	0
data_7		dw	0
sauve_SP	dw	0
sauve_SS	dw	0
data_9		dw	0, 0
drap            equ     0

;------------------------------ PROGRAMME PERE ------------------------------

loc_1:		mov     sauve_SP,sp
		mov     sauve_SS,ss
		mov	ax,80h
		mov	ENVIR,ax	; Ligne de commande...
		mov	data_3,ds
		mov	ax,5Ch		; Premier FCB ( inutilis� )
		mov	FCB_1,ax
		mov	data_5,ds
		mov	ax,6Ch		; Second FCB ( inutilis� )
		mov	FCB_2,ax
		mov	data_7,ds
		mov	ah,35h	
		mov	al,INT_DET
		int	21h		; DOS Services  ah=function 35h
					;  get intrpt vector al in es:bx
		mov	cs:data_9,bx
		mov	word ptr cs:data_9+2,es
		mov	ah,25h		
		mov	al,INT_DET		
		lea	dx,cs:[_int]	; Load effective addr
		int	21h		; DOS Services  ah=function 25h
					;  set intrpt vector al to ds:dx
		lea	dx,cs:[nom_prg]	; Load effective addr
		push	ds
		pop	es
		lea	bx,cs:[paramet]	; Load effective addr
		mov	al,0
		mov	ah,4Bh		
		int	21h		; Appel du programme fils.
					; run progm @ds:dx, parm @es:bx
		mov	sp,sauve_SP	
		mov	ss,sauve_SS	
		mov	ah,25h	
		mov	al,INT_DET	
		mov	dx,cs:data_9
		mov	ds,word ptr cs:data_9+2
		int	21h		;  set intrpt vector al to ds:dx
		mov     ah,4dh
		int     21h
		mov	ah,4Ch
		int	21h		;  terminate with al=return code
sto		endp

;---------------------------- int 16 d�tourn�e -----------------------------

int_entry	proc	far
_int:		push	ax
		push    ds
		push    bp
	        push    cx
		pushf				; Push flags
		cmp     byte ptr ds:[drap],1	; Je regarde si c'est fait.
		jz      loc_2
		cmp	ah,sous_fonction        ; Sous - fonction de l'INT.
		jne	loc_2			; Jump if not equal
		mov     ax,sp
		mov     bp,ds
	        mov     cx,20			; On pope 20 fois pour trouver
incr:		pop     ds			; le bon segment.
		dec     cx
		jz      s
		cmp     word ptr ds:[adr_ip1],0374h	; Si ok on patche.
		jnz     incr				; Sinon on incr�mente.
		mov     byte ptr ds:[adr_ip1],0ebh
		mov     byte ptr ds:[adr_ip2],0ebh
		mov     ds,bp
               mov     byte ptr ds:[drap],1		; On y revient plus.
s:		mov     sp,ax
loc_2:		popf	
		pop     cx
	        pop     bp
		pop     ds			
		pop	ax
		jmp	dword ptr cs:data_9

int_entry	endp

;------------ REDUCTION DE LA PLACE OCCUPEE PAR LE PROGRAMME COM ------------

init:           mov ah,4ah		
		mov bx,offset fin   ; Fin du programme en BX.
		mov cl,4	    ; Divis� par 4 pour avoir des paragraphes.	
		shr bx,cl
		inc bx		    ; On en rajoute un par s�curit�.	
		int 21h		    ; Execution de la fonction 4Ah.
		mov sp,offset fin   ; on d�place la pile en "fin" car elle est
		jmp loc_1           ; plac�e en FFFE dans un programme COM.

fin_init        label near

;----------------------- PLACE RESERVEE POUR LA PILE ------------------------

		dw 47 dup (' ')
		db 65 dup ('*')
                db 40 dup (' '),'FREDDY_SOFT'
		db 44 dup (' '),65 dup ('*')
fin             equ this byte       ; ici le sommet de la pile, SP
seg_a		ends
		end	start


	Et �a marche.
	De plus j'ai r�ussi � lancer un programme fils invisible !

	FREDDY